package fr.syntheses.blog.Model.DAO;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;


import org.apache.log4j.Logger;


import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.List;

import fr.syntheses.blog.beans.Article;
import fr.syntheses.blog.beans.Ficheutilisateur;
import fr.syntheses.blog.beans.Utilisateur;



public class UtilisateurDAO extends ModeleDAO {

	Logger log = Logger.getLogger(UtilisateurDAO.class);
	Connection cnx = null;
	ResultSet resultat= null;
	String requeteString=null;
	PreparedStatement requete = null;
	private static List<Utilisateur> listeUtilisateur;

	/**
	 * Cette methode permet d'identifier un utilisateur
	 * @param requete 
	 * @param requete 
	 * @param requete 
	 * @throws SQLException 
	 */

	public Utilisateur identifie(Utilisateur utilisateur)  {

		log.debug("Entering in  Utilisateur identifie(Utilisateur utilisateur) with an utilisateur : " + utilisateur);




		try {
			// open connection

			cnx = super.getConnection();

			// requete select * from Utilisateur whr

			requeteString= "SELECT * FROM utilisateur WHERE Login=? AND Motdepasse=?";

			// statement

			requete = cnx.prepareStatement(requeteString);

			requete.setString(1, utilisateur.getLogin());
			requete.setString(2,utilisateur.getMotdepasse());


			resultat = requete.executeQuery();

			// mapper
			if (resultat!=null)
			{
				if(resultat.first())
				{
					utilisateur = mapperUtilisateur(resultat);
				}
				else {
					utilisateur = null;
					log.debug("utilisateur non identifié");
				}

			}	

		} catch (Exception e) {
			e.printStackTrace();
		}
		finally
		{
			try {
				// vcloseall
				if (resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				{
					GestionBaseDeDonnees.closeConnection(cnx);
				}



			} catch (Exception e2) {
				log.debug("erreur");
			}
		}


		return utilisateur;
	}






	// MAPPER UTILISATEUR ========================================================== //

	private Utilisateur mapperUtilisateur(ResultSet resultat) throws SQLException {





		log.debug("in mapper of utilisateur entering !");

		//		ResultSetMetaData rsMetaData = resultat.getMetaData();
		//
		//	    int numberOfColumns = rsMetaData.getColumnCount();
		//	    System.out.println("resultSet MetaData column Count=" + numberOfColumns);
		//
		//	    for (int i = 1; i <= numberOfColumns; i++) {
		//	      System.out.println("column MetaData ");
		//	      System.out.println("column number " + i);
		//	      // get the column's name.
		//	      System.out.println(rsMetaData.getColumnName(i));
		//
		//
		//	      
		//	    }



		Utilisateur utilisateur = new Utilisateur();

		try {

			if (resultat.getString("id") == null)
			{
				utilisateur.setId(0);
			}
			else {

				utilisateur.setId(resultat.getInt("id"));
			}


			if (resultat.getString("Login") == null) {
				utilisateur.setLogin("");
			} else {
				utilisateur.setLogin(resultat.getString("login"));
			}


			if (resultat.getString("MotDePasse") == null) {
				utilisateur.setMotdepasse("");
			} else {
				utilisateur.setMotdepasse(resultat.getString("MotDePasse"));
			}

			if (resultat.getString("Prenom") == null) {
				utilisateur.setPrenom("");
			} else {
				utilisateur.setPrenom(resultat.getString("Prenom"));
			}

			if (resultat.getString("Nom") == null) {
				utilisateur.setNom("");
			} else {
				utilisateur.setNom(resultat.getString("Nom"));
			}


			if (resultat.getString("image") == null) {
				utilisateur.setImage("");
			} else {
				utilisateur.setImage(resultat.getString("image"));
			}

		} catch (Exception e) {
			e.printStackTrace();
			log.error("in mapperutilisateur" + e);
		}
		log.debug("in mapper exit with utilisateur" + utilisateur);
		return utilisateur;
	}


	// END MAPPER UTILISATEUR ========================================================== //	




	/**
	 * Cette methode permet de lister les utilisateurs.
	 * @return   List<Utilisateur>
	 */
	public final List<Utilisateur> listerUtilisateur() {


		log.debug("Entering in listerUtilisateur()");


		listeUtilisateur = new ArrayList<Utilisateur>();

		Utilisateur utilisateur = null;

		try {
			// open connection

			cnx = super.getConnection();

			// requete select * from Utilisateur whr

			requeteString = "SELECT * FROM utilisateur ORDER BY Nom";



			// statement
			requete = cnx.prepareStatement(requeteString);

			resultat = requete.executeQuery();
			// on stoke le resultat dans une liste
			if(resultat!=null)
			{
				while(resultat.next())
				{

					// On effectue le mapping des attributs avec les champs de la table SQL
					utilisateur=mapperUtilisateur(resultat);

					// On ajoute l'objet a la liste des articles
					listeUtilisateur.add(utilisateur);
				}
			}
		}
		catch(Exception e)
		{
			log.debug("Erreur dans la requete dans la classe utilisateurDAO ");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(cnx!=null)
				{
					GestionBaseDeDonnees.closeConnection(cnx);
				}
			}
			catch(Exception ex)
			{
				log.debug("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe utilisateur" + ex);
			}	
		}

		// Retourner la liste des articles
		return listeUtilisateur;
	}




	/**
	 * Cette methode permet de supprimer un utilisateur.
	 * @return   
	 */

	public int delete(int idUtilisateur) {

		// variable

		log.info("entering in  deleteUtilisateur (Utilisateur utilisateur)" + idUtilisateur);

		PreparedStatement requete = null;

		Connection cnx = null;

		int codeErreur=0;

		String requeteString=null;

		try {
			// open connection

			cnx = super.getConnection();

			// requete select * from Utilisateur whr

			requeteString = "DELETE FROM utilisateur WHERE id=?";

			requete= cnx.prepareStatement(requeteString);

			requete.setInt(1, idUtilisateur);

			codeErreur = requete.executeUpdate();

		}
		catch (Exception e){

			codeErreur=0;

			log.debug("erreur dans la requete dans la classe UtilisateurDAO fonction suppressionutilisateur" + e);
		}

		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(cnx!=null)
				{
					GestionBaseDeDonnees.closeConnection(cnx);
				}
			}
			catch(Exception ex)
			{
				log.debug("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la method deleteUtilisateur"  + ex);

			}

		}
		return codeErreur;

	}




	/**
	 * Cette methode permet d'ajouter un nouveau utilisateur.
	 * @return 
	 * @return   
	 */



	public int adduser(Utilisateur utilisateur, int lastIdFichDao) {
		// Variables
		PreparedStatement requete=null;
		String requeteString=null;
		int codeErreur=0;

		try
		{			
			// Ouverture d'une connexion
			cnx=super.getConnection();

			// Cr�ation de la requ�te
			requeteString="INSERT INTO utilisateur (FicheutilisateurId,nom , prenom, email,login, motdepasse, role, image) VALUES(?,?,?,?,?,?,?,?)";

			// Pr�paration de la requ�te
			requete=cnx.prepareStatement(requeteString);
			requete.setInt(1, lastIdFichDao);
			requete.setString(2, utilisateur.getNom());
			requete.setString(3, utilisateur.getPrenom());
			requete.setString(4, utilisateur.getEmail());
			requete.setString(5, utilisateur.getLogin());
			requete.setString(6, utilisateur.getMotdepasse());
			requete.setInt(7, utilisateur.getRole());
			requete.setString(8, utilisateur.getImage());

			// Execution de la requete
			codeErreur=requete.executeUpdate();
		}
		catch(Exception e)
		{
			codeErreur=0;
			log.error("Erreur dans la requete dans la classe UtilisateurDAO fonction adduser" + e);
			e.printStackTrace();
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(cnx!=null)
				{
					GestionBaseDeDonnees.closeConnection(cnx);
				}
			}
			catch(Exception ex)
			{
				log.debug("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe UtilisateurDAO fonction adduser");
			}	
		}

		// Retourner le code d'erreur

		return codeErreur;


	}












	public void create() {

	}

	public void read() {

	}

	public void update() {

	}

	public void delete() {

	}




























}